 /*******************************************************************************
  * Copyright (c) 2000, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/

 package org.eclipse.ui.internal.texteditor.spelling;

 import java.util.ArrayList ;
 import java.util.HashMap ;
 import java.util.List ;
 import java.util.Map ;

 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.Platform;

 import org.eclipse.ui.internal.texteditor.TextEditorPlugin;
 import org.eclipse.ui.texteditor.spelling.SpellingEngineDescriptor;

 /**
  * A spelling engine registry used to access the
  * {@link SpellingEngineDescriptor}s that describe the spelling engine
  * extensions.
  *
  * @see SpellingEngineDescriptor
  * @since 3.1
  */
 public class SpellingEngineRegistry {

     /**
      * Extension id of spelling engine extension point.
      * (value <code>"spellingEngine"</code>).
      */
     public static final String SPELLING_ENGINE_EXTENSION_POINT= "spellingEngine"; //$NON-NLS-1$

     /** Ids mapped to descriptors */
     private Map fDescriptorsMap;

     /** Default descriptor or <code>null</code> */
     private SpellingEngineDescriptor fDefaultDescriptor;

     /** All descriptors */
     private SpellingEngineDescriptor[] fDescriptors;

     /** <code>true</code> iff the extensions have been loaded at least once */
     private boolean fLoaded= false;

     /**
      * Returns the descriptor with the given id or <code>null</code> if
      * none could be found.
      *
      * @param id the id
      * @return the descriptor with the given id or <code>null</code>
      */
     public SpellingEngineDescriptor getDescriptor(String id) {
         ensureExtensionsLoaded();
         return (SpellingEngineDescriptor) fDescriptorsMap.get(id);
     }

     /**
      * Returns the default descriptor.
      *
      * @return the default descriptor
      */
     public SpellingEngineDescriptor getDefaultDescriptor() {
         ensureExtensionsLoaded();
         return fDefaultDescriptor;
     }

     /**
      * Returns all descriptors.
      *
      * @return all descriptors
      */
     public SpellingEngineDescriptor[] getDescriptors() {
         ensureExtensionsLoaded();
         return fDescriptors;
     }

     /**
      * Reads all extensions.
      * <p>
      * This method can be called more than once in order to reload
      * from a changed extension registry.
      * </p>
      */
     public synchronized void reloadExtensions() {
         List descriptors= new ArrayList ();
         fDescriptorsMap= new HashMap ();
         fDefaultDescriptor= null;
         IConfigurationElement[] elements= Platform.getExtensionRegistry().getConfigurationElementsFor(TextEditorPlugin.PLUGIN_ID, SPELLING_ENGINE_EXTENSION_POINT);
         for (int i= 0; i < elements.length; i++) {
             SpellingEngineDescriptor descriptor= new SpellingEngineDescriptor(elements[i]);
             descriptors.add(descriptor);
             fDescriptorsMap.put(descriptor.getId(), descriptor);
             if (fDefaultDescriptor == null && descriptor.isDefault())
                 fDefaultDescriptor= descriptor;
         }
         fDescriptors= (SpellingEngineDescriptor[]) descriptors.toArray(new SpellingEngineDescriptor[descriptors.size()]);
         fLoaded= true;
     }

     /**
      * Ensures the extensions have been loaded at least once.
      */
     private void ensureExtensionsLoaded() {
         if (!fLoaded)
             reloadExtensions();
     }
 }

